package org.example.day03;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 服务之间交换的接口成功率作为服务调用关键质量特性，某个时间段内的接口失败率使用一个数组表示，数组中每个元素都是单位时间内失败率数值，数组中的数值为0~100的整数，给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值，即平均失败率小于等于minAverageLost，找出数组中最长时间段，如果未找到则直接返回NULL。
 *
 * 服务之间交换的接口成功率作为服务调用关键质量特性，某个时间段内的接口失败率使用一个数组表示，
 * 数组中每个元素都是单位时间内失败率数值，数组中的数值为0~100的整数，给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值，
 * 即平均失败率小于等于minAverageLost，找出数组中最长时间段，如果未找到则直接返回NULL。
 * @date 2024/3/11 15:22
 */
public class test057 {
    public static int getSum(int[] arr, int start, int end) {
        int sumVal = 0;
        for (int i = start; i <= end; i++) {
            sumVal += arr[i];
        }
        return sumVal;
    }

    public static String process(int[] arr, int minAverageLost) {
        int size = arr.length;  // 数组长度
        int maxLen = 0;  // 最大长度
        List<String> ans = new ArrayList<>();  // 存储结果的列表

        for (int start = 0; start < size - 1; start++) {  // 遍历数组，起始索引从0到size-2
            for (int end = start + 1; end < size; end++) {  // 遍历数组，结束索引从start+1到size-1
                int sumVal = getSum(arr, start, end);  // 计算子数组的和
                int currLen = end - start + 1;  // 计算子数组的长度

                if (sumVal == 0 && minAverageLost >= 0) {
                    // 如果子数组的和为0且minAverageLost大于等于0
                    String tmp = start + "-" + end;  // 格式化起始索引和结束索引
                    if (maxLen == currLen) {  // 如果当前子数组长度等于最大长度
                        ans.add(tmp);  // 将子数组的起始索引和结束索引添加到结果列表中
                    } else if (currLen > maxLen) {  // 如果当前子数组长度大于最大长度
                        maxLen = currLen;  // 更新最大长度
                        ans.clear();  // 清空结果列表
                        ans.add(tmp);  // 更新结果列表为只包含当前子数组的起始索引和结束索引
                    }
                } else if (sumVal <= minAverageLost * currLen) {
                    // 如果子数组的和小于等于minAverageLost乘以子数组长度
                    String tmp = start + "-" + end;  // 格式化起始索引和结束索引
                    if (maxLen == currLen) {  // 如果当前子数组长度等于最大长度
                        ans.add(tmp);  // 将子数组的起始索引和结束索引添加到结果列表中
                    } else if (currLen > maxLen) {  // 如果当前子数组长度大于最大长度
                        maxLen = currLen;  // 更新最大长度
                        ans.clear();  // 清空结果列表
                        ans.add(tmp);  // 更新结果列表为只包含当前子数组的起始索引和结束索引
                    }
                }
            }
        }

        if (ans.isEmpty()) {  // 如果结果列表为空
            return "NULL";
        }

        return String.join(" ", ans);  // 将结果列表中的起始索引和结束索引连接成字符串
    }

    public static void main(String[] args) {
        int[] arr = {0,1,2,3,4};  // 更换为需要的数组
        int minAverageLost = 1;  // 更换为需要的minAverageLost
        String result = process(arr, minAverageLost);
        System.out.println(result);
    }
}

